/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.talentos.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.talentos.dao.TipoOcorrenciaDAO;
import br.uniceub.fsw.talentos.vo.TipoOcorrenciaVO;
import br.uniceub.fsw.talentos.bo.TipoOcorrenciaBO;
import br.uniceub.fsw.util.TabelaHtml;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Facade da entidade TipoOcorrencia.
 * 
 * @author Bruno Schifer Bernardi
 */
public class TipoOcorrenciaFacade {
    /**
     * Mensagem de retorno do sistema.
     */
    private String message;

    /**
     * Value object do tipoOcorrencia.
     */
    private TipoOcorrenciaVO tipoOcorrencia;
    
    /**
     * Objeto de acesso aos dados de tipoOcorrencia.
     */
    private TipoOcorrenciaDAO tipoOcorrenciaDao;
    
    /**
     * Objeto da camada de negócio de tipoOcorrencia.
     */
    private TipoOcorrenciaBO tipoOcorrenciaBo;
    
    /**
     * Construtor da classe.
     */
    public TipoOcorrenciaFacade() {
        this.tipoOcorrenciaDao = new TipoOcorrenciaDAO();
        this.tipoOcorrenciaBo = new TipoOcorrenciaBO();
    }
    
    /**
     * Getter da mensagem de retorno.
     * 
     * @return Mensagem de retorno.
     */
    public String getMessage() {
        String retorno = null;
        if(this.message == null || this.message.equals("")) {
            retorno = "&nbsp";
        } else {
            retorno = this.message;
        }
        return retorno;
    }

    /**
     * Setter da mensagem de retorno.
     * 
     * @param message Mensagem de retorno.
     */
    public void setMessage(String message) {
        this.message = message;
    }
    
    /**
     * Responsável por executar a operação selecionada pelo usuário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void operacao(HttpServletRequest req, HttpServletResponse resp) {
        String oper = req.getParameter("operacao");

        if(oper != null)
        {
            if (oper.equals("consultar")) {
                this.consultar(req, resp);
            }
            if (oper.equals("incluir")) {
                this.incluir(req, resp);
            }
            if (oper.equals("alterar")) {
                this.alterar(req, resp);
            }
            if (oper.equals("excluir")) {
                this.excluir(req, resp);
            }
            if (oper.equals("confirmar")) {
                this.confirmar(req, resp);
            }
        }
    }

    /**
     * Retorna o tipoOcorrencia.
     * 
     * @return Objeto tipoOcorrencia.
     */
    public TipoOcorrenciaVO getTipoOcorrencia() {
        return this.tipoOcorrencia;
    }
    
    /**
     * Seta o tipoOcorrencia.
     * 
     * @param tipoOcorrencia Objeto tipoOcorrencia.
     */
    public void setTipoOcorrencia(TipoOcorrenciaVO tipoOcorrencia) {
        this.tipoOcorrencia = tipoOcorrencia;
    }
    
    /**
     * Consultar um tipoOcorrencia.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void consultar(HttpServletRequest req, HttpServletResponse resp) {
        String idTipoOcorrenciaTmp = req.getParameter("idTipoOcorrencia");
        
        Integer idTipoOcorrencia = null;
        
        if(idTipoOcorrenciaTmp == null || idTipoOcorrenciaTmp.equals("")) {
            return;
        } else {
            idTipoOcorrencia = Integer.parseInt(idTipoOcorrenciaTmp);
        }
        
        this.tipoOcorrencia = tipoOcorrenciaDao.consultarPorId(idTipoOcorrencia);
    }

    /**
     * Incluir um tipoOcorrencia.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void incluir(HttpServletRequest req, HttpServletResponse resp) {
        String noOcorrencia = req.getParameter("noOcorrencia");
        String dsOcorrencia = req.getParameter("dsOcorrencia");

        tipoOcorrencia = new TipoOcorrenciaVO();
        tipoOcorrencia.setNoOcorrencia(noOcorrencia);
        tipoOcorrencia.setDsOcorrencia(dsOcorrencia);
        
        String mensagem = null;
        
        // Validações da BO
        try {
            tipoOcorrenciaBo.validarVOUnico(tipoOcorrencia);
        } catch(NegocioException ex) {
            mensagem = ex.getMessage();
        }
        
        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                tipoOcorrenciaDao.inserir(tipoOcorrencia);

                Transacao.efetivar();

                mensagem = "Tipo de Ocorrencia incluído com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na inclusão do tipo de ocorrencia: " + ex.getMessage();
                
                tipoOcorrencia = null;
            }
        } else {
            tipoOcorrencia = null;
        }
        
        this.message = mensagem;
    }

    /**
     * Alterar um tipoOcorrencia.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void alterar(HttpServletRequest req, HttpServletResponse resp) {
        String idTipoOcorrencia = req.getParameter("idTipoOcorrencia");
        String noOcorrencia = req.getParameter("noOcorrencia");
        String dsOcorrencia = req.getParameter("dsOcorrencia");

        tipoOcorrencia = new TipoOcorrenciaVO();
        tipoOcorrencia.setIdTipoOcorrencia(Integer.parseInt(idTipoOcorrencia));
        tipoOcorrencia.setNoOcorrencia(noOcorrencia);
        tipoOcorrencia.setDsOcorrencia(dsOcorrencia);
        
        String mensagem = null;
        
        // Validações da BO
        try {
            tipoOcorrenciaBo.validarVOUnico(tipoOcorrencia);
        } catch(NegocioException ex) {
            mensagem = ex.getMessage();
        }
        
        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                tipoOcorrenciaDao.alterar(tipoOcorrencia);

                Transacao.efetivar();

                mensagem = "Tipo de ocorrencia alterado com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na alteração do tipo de ocorrencia: " + ex.getMessage();
            }
        } else {
            tipoOcorrencia = null;
        }
        
        this.message = mensagem;
    }
    /**
     * Excluir um tipoOcorrencia.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void excluir(HttpServletRequest req, HttpServletResponse resp) {
        String idTipoOcorrencia = req.getParameter("idTipoOcorrencia");

        tipoOcorrencia = new TipoOcorrenciaVO();
        tipoOcorrencia.setIdTipoOcorrencia(Integer.parseInt(idTipoOcorrencia));
        
        String mensagem = null;

        try {
            Transacao.iniciar();
            
            tipoOcorrenciaDao.excluir(tipoOcorrencia);
            
            Transacao.efetivar();
            
            mensagem = "Tipo de ocorrencia excluído com sucesso.";
        } catch (Exception ex) {
            Transacao.desfazer();
            
            mensagem = "Problema na exclusão do tipo de ocorrencia: " + ex.getMessage();
        }
        
        this.tipoOcorrencia = null;
        
        this.message = mensagem;
    }
    
    /**
     * Confirmar a exclusão de tipoOcorrencia.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void confirmar(HttpServletRequest req, HttpServletResponse resp) {
        String idTipoOcorrencia = req.getParameter("idTipoOcorrencia");
        String noOcorrencia = req.getParameter("noOcorrencia");
        String dsOcorrencia = req.getParameter("dsOcorrencia");

        tipoOcorrencia = new TipoOcorrenciaVO();
        tipoOcorrencia.setIdTipoOcorrencia(Integer.parseInt(idTipoOcorrencia));
        tipoOcorrencia.setNoOcorrencia(noOcorrencia);
        tipoOcorrencia.setDsOcorrencia(dsOcorrencia);
    }

    /**
     * Retorna uma lista de tipoOcorrencias a partir de parâmetros da tela
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     * @return objeto tabela com as informações necessárias
     */
    public TabelaHtml consultarTipoOcorrencias(HttpServletRequest req, HttpServletResponse resp) {
        String nome = req.getParameter("noOcorrencia");
        
        if(nome != null && !nome.equals("")) {
            TabelaHtml tabela = new TabelaHtml();
            
            tabela.setCampoRetorno("idTipoOcorrencia");
            
            tabela.adicionarTitulo("Id");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("Integer");
            tabela.adicionarStatus(false);

            tabela.adicionarTitulo("Nome");
            tabela.adicionarTamanho(80);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);
            
            tabela.adicionarTitulo("Descrição");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(false);
            
            tabela.gravarCampos();
            
            TipoOcorrenciaVO exemplo = new TipoOcorrenciaVO();
            
            exemplo.setNoOcorrencia(nome);
            
            // Lista de tipoOcorrencias
            List<TipoOcorrenciaVO> tipoOcorrencias = tipoOcorrenciaDao.consultarPorExemplo(exemplo);
            
            // Adiciona os valores de cada tipoOcorrencia nas listas de ids e nomes
            for(int i = 0; i < tipoOcorrencias.size(); i++) {
                tabela.adicionarRegistro(converterVoParaString(tipoOcorrencias.get(i)));
            }

            return tabela;
        }

        if(nome == null) {
            TabelaHtml tabela = new TabelaHtml();

            tabela.setCampoRetorno("idTipoOcorrencia");

            tabela.adicionarTitulo("Id");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("Integer");
            tabela.adicionarStatus(false);

            tabela.adicionarTitulo("Nome");
            tabela.adicionarTamanho(80);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);

            tabela.adicionarTitulo("Descrição");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(false);

            tabela.gravarCampos();

            TipoOcorrenciaVO tudo = new TipoOcorrenciaVO();

            tudo.setNoOcorrencia(nome);

            // Lista de tipoOcorrencias
            List<TipoOcorrenciaVO> tipoOcorrencias = tipoOcorrenciaDao.consultarTudo(tudo);

            // Adiciona os valores de cada tipoOcorrencia nas listas de ids e nomes
            for(int i = 0; i < tipoOcorrencias.size(); i++) {
                tabela.adicionarRegistro(converterVoParaString(tipoOcorrencias.get(i)));
            }

            return tabela;
        }
            return null;
    }
    /**
     * Transforma os campos de um VO em uma lista de Strings
     * 
     * @return lista de strings com os valores em ordem
     */
    public List<String> converterVoParaString(TipoOcorrenciaVO tipoOcorrencia) {
        List<String> valores = new ArrayList<String>();
        
        valores.add(tipoOcorrencia.getIdTipoOcorrencia().toString());
        valores.add(tipoOcorrencia.getNoOcorrencia());
        valores.add(tipoOcorrencia.getDsOcorrencia());
        
        return valores;
    }
}
